在之前的 Django 章節中,我們提到過資料庫(Database)。Web 應用程式中的資料通常儲存在硬碟上的資料庫中,而 Django 則透過內建的模組來處理 Web 應用程式與資料庫之間的溝通。相較之下,像 Flask 這類輕量級框架並不提供內建的資料庫整合模組,因此開發者需要自行選擇合適的套件或自行開發。ORM(物件關聯對映)則是開發者常選擇的工具之一。
ORM 的全名是 Object-Relational Mapping,其中的 Object 代表 Python 中的物件,而 Relational 則指關聯式資料庫(Relational Database)。關聯式資料庫是目前主流的資料庫之一,適用於許多資料存取的情境。從名稱 "Object-Relational Mapping" 可以看出,ORM 是程式語言與資料庫之間的橋樑,開發者透過 Python 物件即可輕鬆地進行資料庫存取任務。
在之前提到的 Django 中,Model 其實也是一種 ORM。而在 Python 的套件中,另一個知名的 ORM 是 SQLAlchemy。接下來,我將通過範例介紹如何定義、創建以及查詢資料。
本次範例使用的是 SQLAlchemy 2.0.34 版本
poetry add SQLAlchemy==2.0.34
本文將繼續以之前 Django 章節中的購物平台範例作為例子。首先,開發者需要先定義一個 Base Class,作為 ORM 的基礎類別。接著,定義一個 Product 類別(商品),並繼承自 Base Class。其中,name 欄位用來儲存商品名稱,並限制名稱的最大長度為 200 個字元。
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.orm import Mapped
from sqlalchemy.orm import mapped_column
from sqlalchemy import String
class Base(DeclarativeBase):
pass
class Product(Base):
name: Mapped[str] = mapped_column(String(200))
當開發者想從硬碟中的資料庫取得資料時,首先需要建立 Python 與資料庫之間的連線(Session)。接著,使用 select
函數來查詢所需的物件。例如,在本次範例中,開發者希望取得商品(Product)。此外,開發者可以使用 where
函數來設定篩選條件,如查詢名稱為 "demo 1" 的商品。最終,開發者便可取得所需的 product 物件。
from sqlalchemy import create_engine
from sqlalchemy import select
from sqlalchemy.orm import Session
engine = create_engine("sqlite://", echo=True)
session = Session(engine)
stmt = select(User).where(Product.name = "demo 1")
product = session.scalars(stmt).one()